package com.example.anew.journey.mynewjourney.base;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.example.anew.journey.mynewjourney.R;
import com.example.anew.journey.mynewjourney.customview.MyStatusView;
import com.example.anew.journey.mynewjourney.customview.StatusLayout;
import com.example.anew.journey.mynewjourney.utils.AntiShake;
import com.example.anew.journey.mynewjourney.utils.IsNetworkUtils;

/**
 * 杭州惟君医疗科技有限公司15
 * Created by 20433 on 2018/3/7
 */

public abstract class BaseFragment extends Fragment {
    public Context mcontext;
    LinearLayout ll;
    MyStatusView statusView;
    StatusLayout statusLayout;
    AntiShake util;

    /**
     * @desc 当Fragment被添加到Activity的时候调用
     * @desc 调用一次
     */
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mcontext = context;
        // 防抖动工具类
        util = new AntiShake();
    }

    /**
     * @desc 创建Fragment的时候调用
     * @desc 调用一次
     */
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        registeredIntent();
    }

    /**
     * @desc 创建Fragment的时候调用和绘制view的时候调用
     * @desc 有可能调用多次
     */
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_base, container, false);
        ll = view.findViewById(R.id.fragment_base_ll);
        ll.addView(setFragmentView(inflater, container));
        multistateView();
        showLoading();
        return view;
    }

    /**
     * @desc 多状态视图
     */
    private void multistateView() {
        statusView = MyStatusView.getInstance(mcontext, "就是没有数据怎么招吧", new MyStatusView.onRetryClickLister() {
            @Override
            public void onRetryClick() {
                Toast.makeText(mcontext, "重新加载数据", Toast.LENGTH_LONG).show();
                statusLayout.showLoading();
            }
        });
        statusLayout = new StatusLayout.Builder().setContentView(ll).setStatusView(statusView).build();
        if (!IsNetworkUtils.isNetworkConnected(mcontext)) {  //没有网络
            statusLayout.showSetting();
        }
    }

    /**
     * @desc 创建Fragment和绘制view好后的时候调用
     * @desc 有可能调用多次
     */
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        init(view);
    }

    /**
     * @desc Fragment所在的Activity被启动完成时调用
     * @desc 有可能调用多次
     */
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        startActivity();
    }

    /**
     * @desc 启动Fragment时调用
     * @desc 有可能调用多次
     */
    @Override
    public void onStart() {
        super.onStart();
        PopupPrompts();
    }

    /**
     * @desc 恢复Fragment时调用并且onStart()之后必定调用
     * @desc 有可能调用多次
     */
    @Override
    public void onResume() {
        super.onResume();
        fragmentResume();

    }

    /**
     * @desc 可见，不可获取焦点
     * @desc 有可能调用多次
     */
    @Override
    public void onPause() {
        super.onPause();
        CloseBounced();
    }

    /**
     * @desc 不可见，失去焦点
     * @desc 有可能调用多次
     */
    @Override
    public void onStop() {
        super.onStop();
        CloseBackgroundOperation();
    }


    /**
     * @desc 销毁Fragment的view时调用
     * @desc 有可能调用多次
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        LayoutResourceRelease();
    }

    /**
     * @desc 一定调用
     * @desc 只调用一次
     */
    @Override
    public void onDestroy() {
        super.onDestroy();
        unRegisterIntent();
    }

    /**
     * @desc 在onDestroy()之后调用
     * @desc 只调用一次
     */
    @Override
    public void onDetach() {
        super.onDetach();
        releaseResources();
    }

/**===================多种状态页面控制=========================*/
    /**
     * @desc 显示内容页面
     */
    public void showContent() {
        statusLayout.showContent();
    }

    /**
     * @desc 显示空数据页面
     */
    public void showEmpty() {
        statusLayout.showEmpty();
    }

    /**
     * @desc 显示加载错误页面
     */
    public void showRetry() {
        statusLayout.showRetry();
    }

    /**
     * @desc 显示网络错误页面
     */
    public void showSetting() {
        statusLayout.showSetting();
    }

    /**
     * @desc 显示正在加载页面
     */
    public void showLoading() {
        statusLayout.showLoading();
    }

/**============================================*/


    /**
     * @desc 在这里做一些注册活动 onCreate()
     * @desc 调用一次
     */
    protected abstract void registeredIntent();

    /**
     * @desc 填充Fragment的布局 onCreateView()
     * @desc 有可能调用多次
     */
    protected abstract View setFragmentView(LayoutInflater inflater, ViewGroup container);

    /**
     * @desc Fragment绘制view好后初始化 onViewCreated()
     * @desc 有可能调用多次
     */
    protected abstract void init(View view);

    /**
     * @desc Fragment所在的Activity被启动  onActivityCreated();
     * @desc 有可能调用多次
     */
    protected abstract void startActivity();

    /**
     * @desc 弹出一些提示框  onStart()
     * @desc 有可能调用多次
     */
    protected abstract void PopupPrompts();

    /**
     * @desc 恢复Fragment可见获取到焦点  onResume()
     * @desc 有可能调用多次
     */
    protected abstract void fragmentResume();

    /**
     * @desc 关闭一些弹框  onPause()
     * @desc 有可能调用多次
     */
    protected abstract void CloseBounced();

    /**
     * @desc 关闭一些后台的操作  onStop()
     * @desc 有可能调用多次
     */
    protected abstract void CloseBackgroundOperation();

    /**
     * @desc 布局资源释放  onDestroyView()
     * @desc 有可能调用多次
     */
    protected abstract void LayoutResourceRelease();

    /**
     * @desc 解注册活动  onDestroy()
     * @desc 只调用一次
     */
    protected abstract void unRegisterIntent();

    /**
     * @desc 释放一些资源  onDetach()
     * @desc 只调用一次
     */
    protected abstract void releaseResources();

}
